// class
// 函数 : 函数重载
// 泛型 :
// 高级类型 : 联合类型和交叉类型 索引类型 扩展类型...

// 类 :
class Person {
  // 实例属性
  // username = '123'
  // 方法
  // 构造函数

  // ts声明实例属性的时候 一般之规定类型和关键字 写法1 : 在类的开头声明
  // private username:string
  // 2. 可以再构造函数的参数里面声明
  constructor(private username: string) {
    // 1. 如果声明实例 需要在上面先声明一下
    // this.username = '124'
    this.username = username;
  }

  // 2. 声明参数和返回值类型
  disp(): void {
    this.__innerMethod();
  }

  // 3. 只希望内部调用 private:
  private __innerMethod() {
    // 实现内部的方法 只供给内部调用
    console.log("内部调用");
  }

  // 受保护的protected 只有子类才能调用
  protected giveChildrenLove() {
    console.log("受保护的");
  }

  // static : 静态方法 属于类 : 只能被类调用
  static sayName() {
    console.log("类的方法");
  }
}

class Child extends Person {
  constructor() {
    super("张三"); // super : 调用的是 父类的构造函数
    // Person.sayName()
    this.giveChildrenLove();
  }
}

let person = new Person("李逵");
// react
// class ComponentClass extends React.Component{

// }

// ComponentClass.ProType = {
//   name : string,

// }

// 类调用的方法  : 此时该方法属于类
Person.sayName();
// person.sayName()

// let person = new Child()
// person.giveChildrenLove()
// person.__innerMethod()
// person.username

interface IArrType {
  id: number;
  name?: string;
}

class Parent {
  // 获取随机颜色
  protected getRandomColor(): string {
    // 16777215 : 16进制变成10进制的最大数
    //
    return "#" + Math.floor(Math.random() * 16777215).toString(16);
  }

  private getRandomNumber(min: number, max: number): number {
    return Math.floor(Math.random() * (max - min + 1) + min);
  }

  getRandom(min: number, max: number) {
    return this.getRandomNumber(min, max);
  }

  getSum(a: number, ...reset: number[]): number {
    // let sum = a
    // for(let i=0;i<reset.length;i++){
    //   sum += reset[i]
    // }
    const res = reset.reduce((pre, cur) => {
      return pre + cur;
    }, a);

    return res;
  }
}

class ChildColor extends Parent {
  getColor(): string {
    return this.getRandomColor();
  }

  sortArr(arr: Array<IArrType>): Array<IArrType> {
    // 排好顺序
    return arr.sort((a, b) => a.id - b.id);
  }
}

// new ChildColor().getColor()

console.log(new Parent().getRandom(100, 200));

let arrTest: Array<IArrType> = [
  { id: 100, name: "郑十二" },
  { id: 110, name: "王十三" },
  { id: 20, name: "李四" },
  { id: 30, name: "王五" },
  { id: 120, name: "李十四" },
  { id: 40 },
  { id: 50, name: "田七" },
  { id: 60, name: "钱八" },
  { id: 70, name: "孙九" },
  { id: 130, name: "张十五" },
  { id: 140, name: "李十六" },
  { id: 150, name: "王十七" },
  { id: 10, name: "张三" },
  { id: 80, name: "周十" },
  { id: 90, name: "吴十一" },
];
let sortArr = new ChildColor().sortArr(arrTest);
console.log(sortArr);

let sum = new Parent().getSum(
  10,
  20,
  30,
  40,
  50,
  60,
  70,
  80,
  90,
  100,
  110,
  120,
  130,
  140,
  150
);
console.log(sum);

